package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序自定义类型元素
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(5,6));
        list.add(new Point(38,78));
        list.add(new Point(98,52));
        list.add(new Point(1,2));
        list.add(new Point(0,56));
        list.add(new Point(7,38));
        list.add(new Point(2,4));
        System.out.println(list);
        /*
            compare:比较
            sort方法在排序集合时要求集合元素必须可以比较大小。
            是否可以比较大小的依据是元素是否实现了接口:Comparable

            侵入性问题:
            当我们使用某个API时，如果它要求我们为其修改额外的代码，那么该
            操作就具有侵入性，而侵入性不利于程序后期的维护，因此应当尽量避免
         */
//        Collections.sort(list);

        //为集合元素定义一个比较规则用于排序
//        MyComparator c = new MyComparator();
//        Collections.sort(list,c);
//        System.out.println(list);


        //使用匿名匿名内部类方式创建比较器
//        Comparator<Point> c = new Comparator<Point>(){
//            public int compare(Point o1, Point o2) {
//                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
//                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
//                return len1-len2;
//            }
//        };
//        Collections.sort(list,c);


        Collections.sort(list,new Comparator<Point>(){
            public int compare(Point o1, Point o2) {
                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return len1-len2;
            }
        });

        System.out.println(list);
    }
}

//class MyComparator implements Comparator<Point>{
//
//    @Override
//    public int compare(Point o1, Point o2) {
//        //比较规则，点到原点的距离长的大
//        //求o1点到原点的距离
//        int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
//        //求o2点到原点的距离
//        int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
//        /*
//            返回值用来对外表示o1与o2比较大小的规则，返回值要求:
//            当返回值>0时，表示o1>o2
//            当返回值<0时，表示o1<o2
//            当返回值=0时，表示o1=o2
//         */
//        return len1-len2;
//    }
//}
